home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 8 / QRZ Ham Radio Callsign Database - Volume 8.iso / mac / files / dsp / dspkgctr.z / dspkgctr / gcc / genconfig.c < prev    next >
C/C++ Source or Header  |  1992-06-08  |  7KB  |  292 lines

  1. /* Generate from machine description:
  2.  
  3.    - some #define configuration flags.
  4.    Copyright (C) 1987 Free Software Foundation, Inc.
  5.  
  6.    $Id: genconfig.c,v 1.2 91/01/15 09:47:43 jeff Exp $
  7.  
  8. This file is part of GNU CC.
  9.  
  10. GNU CC is free software; you can redistribute it and/or modify
  11. it under the terms of the GNU General Public License as published by
  12. the Free Software Foundation; either version 1, or (at your option)
  13. any later version.
  14.  
  15. GNU CC is distributed in the hope that it will be useful,
  16. but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. GNU General Public License for more details.
  19.  
  20. You should have received a copy of the GNU General Public License
  21. along with GNU CC; see the file COPYING.  If not, write to
  22. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  23.  
  24.  
  25. #include <stdio.h>
  26. #include "config.h"
  27. #include "rtl.h"
  28. #include "obstack.h"
  29.  
  30. struct obstack obstack;
  31. struct obstack *rtl_obstack = &obstack;
  32.  
  33. #define obstack_chunk_alloc xmalloc
  34. #define obstack_chunk_free free
  35. extern int xmalloc ();
  36. extern void free ();
  37.  
  38. /* flags to determine output of machine description dependent #define's.  */
  39. int max_recog_operands_flag;
  40. int max_dup_operands_flag;
  41. int max_clobbers_per_insn_flag;
  42. int register_constraint_flag;
  43.  
  44. int clobbers_seen_this_insn;
  45. int dup_operands_seen_this_insn;
  46.  
  47. void fatal ();
  48. void fancy_abort ();
  49.  
  50. void
  51. walk_insn_part (part)
  52.      rtx part;
  53. {
  54.   register int i, j;
  55.   register RTX_CODE code;
  56.   register char *format_ptr;
  57.  
  58.   if (part == 0)
  59.     return;
  60.  
  61.   code = GET_CODE (part);
  62.   switch (code)
  63.     {
  64.     case CLOBBER:
  65.       clobbers_seen_this_insn++;
  66.       break;
  67.  
  68.     case MATCH_OPERAND:
  69.       if (XINT (part, 0) > max_recog_operands_flag)
  70.     max_recog_operands_flag = XINT (part, 0);
  71.       if (XSTR (part, 2) && *XSTR (part, 2))
  72.     register_constraint_flag = 1;
  73.       return;
  74.  
  75.     case MATCH_OPERATOR:
  76.       if (XINT (part, 0) > max_recog_operands_flag)
  77.     max_recog_operands_flag = XINT (part, 0);
  78.       /* Now scan the rtl'x in the vector inside the match_operator.  */
  79.       break;
  80.  
  81.     case LABEL_REF:
  82.       if (GET_CODE (XEXP (part, 0)) == MATCH_OPERAND)
  83.     break;
  84.       return;
  85.  
  86.     case MATCH_DUP:
  87.       ++dup_operands_seen_this_insn;
  88.       if (XINT (part, 0) > max_recog_operands_flag)
  89.     max_recog_operands_flag = XINT (part, 0);
  90.  
  91.     case REG: case CONST_INT: case SYMBOL_REF:
  92.     case PC: case CC0:
  93.       return;
  94.     }
  95.  
  96.   format_ptr = GET_RTX_FORMAT (GET_CODE (part));
  97.  
  98.   for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
  99.     switch (*format_ptr++)
  100.       {
  101.       case 'e':
  102.       case 'u':
  103.     walk_insn_part (XEXP (part, i));
  104.     break;
  105.       case 'E':
  106.     if (XVEC (part, i) != NULL)
  107.       for (j = 0; j < XVECLEN (part, i); j++)
  108.         walk_insn_part (XVECEXP (part, i, j));
  109.     break;
  110.       }
  111. }
  112.  
  113. void
  114. gen_insn (insn)
  115.      rtx insn;
  116. {
  117.   int i;
  118.  
  119.   /* Walk the insn pattern to gather the #define's status.  */
  120.   clobbers_seen_this_insn = 0;
  121.   dup_operands_seen_this_insn = 0;
  122.   if (XVEC (insn, 1) != 0)
  123.     for (i = 0; i < XVECLEN (insn, 1); i++)
  124.       walk_insn_part (XVECEXP (insn, 1, i));
  125.  
  126.   if (clobbers_seen_this_insn > max_clobbers_per_insn_flag)
  127.     max_clobbers_per_insn_flag = clobbers_seen_this_insn;
  128.   if (dup_operands_seen_this_insn > max_dup_operands_flag)
  129.     max_dup_operands_flag = dup_operands_seen_this_insn;
  130. }
  131.  
  132. /* Similar but scan a define_expand.  */
  133.  
  134. void
  135. gen_expand (insn)
  136.      rtx insn;
  137. {
  138.   int i;
  139.  
  140.   /* Walk the insn pattern to gather the #define's status.  */
  141.  
  142.   /* Note that we don't bother recording the number of MATCH_DUPs
  143.      that occur in a gen_expand, because only reload cares about that.  */
  144.   if (XVEC (insn, 1) != 0)
  145.     for (i = 0; i < XVECLEN (insn, 1); i++)
  146.       {
  147.     /* Compute the maximum SETs and CLOBBERS
  148.        in any one of the sub-insns;
  149.        don't sum across all of them.  */
  150.     clobbers_seen_this_insn = 0;
  151.  
  152.     walk_insn_part (XVECEXP (insn, 1, i));
  153.  
  154.     if (clobbers_seen_this_insn > max_clobbers_per_insn_flag)
  155.       max_clobbers_per_insn_flag = clobbers_seen_this_insn;
  156.       }
  157. }
  158.  
  159. void
  160. gen_peephole (peep)
  161.      rtx peep;
  162. {
  163.   int i;
  164.  
  165.   /* Look through the patterns that are matched
  166.      to compute the maximum operand number.  */
  167.   for (i = 0; i < XVECLEN (peep, 0); i++)
  168.     walk_insn_part (XVECEXP (peep, 0, i));
  169. }
  170.  
  171. int
  172. xmalloc (size)
  173. {
  174.   register int val = malloc (size);
  175.  
  176.   if (val == 0)
  177.     fatal ("virtual memory exhausted");
  178.  
  179.   return val;
  180. }
  181.  
  182. int
  183. xrealloc (ptr, size)
  184.      char *ptr;
  185.      int size;
  186. {
  187.   int result = realloc (ptr, size);
  188.   if (!result)
  189.     fatal ("virtual memory exhausted");
  190.   return result;
  191. }
  192.  
  193. void
  194. fatal (s, a1, a2)
  195.      char *s;
  196. {
  197.   fprintf (stderr, "genconfig: ");
  198.   fprintf (stderr, s, a1, a2);
  199.   fprintf (stderr, "\n");
  200.   exit (FATAL_EXIT_CODE);
  201. }
  202.  
  203. /* More 'friendly' abort that prints the line and file.
  204.    config.h can #define abort fancy_abort if you like that sort of thing.  */
  205.  
  206. void
  207. fancy_abort ()
  208. {
  209.   fatal ("Internal gcc abort.");
  210. }
  211.  
  212. int
  213. main (argc, argv)
  214.      int argc;
  215.      char **argv;
  216. {
  217.   rtx desc;
  218.   FILE *infile;
  219.   extern rtx read_rtx ();
  220.   register int c;
  221.  
  222.   obstack_init (rtl_obstack);
  223.  
  224.   if (argc <= 1)
  225.     fatal ("No input file name.");
  226.  
  227.   infile = fopen (argv[1], "r");
  228.   if (infile == 0)
  229.     {
  230.       perror (argv[1]);
  231.       exit (FATAL_EXIT_CODE);
  232.     }
  233.  
  234.   init_rtl ();
  235.  
  236.   printf ("/* Generated automatically by the program `genconfig'\n\
  237. from the machine description file `md'.  */\n\n");
  238.  
  239.   /* Read the machine description.  */
  240.  
  241.   while (1)
  242.     {
  243.       c = read_skip_spaces (infile);
  244.       if (c == EOF)
  245.     break;
  246.       ungetc (c, infile);
  247.  
  248.       desc = read_rtx (infile);
  249.       if (GET_CODE (desc) == DEFINE_INSN)
  250.     gen_insn (desc);
  251.       if (GET_CODE (desc) == DEFINE_EXPAND)
  252.     gen_expand (desc);
  253.       if (GET_CODE (desc) == DEFINE_PEEPHOLE)
  254.     gen_peephole (desc);
  255.     }
  256.  
  257.   /* 3 more than needed for this md file, for the sake of asm constructs.  */
  258. #if defined( DSP56000 ) || defined( DSP96000 ) 
  259. /* we want to specify the maximium number of asm operands in the manual. 
  260.    we force these MAX_s to be >= the max specified in the manual. */
  261. #if defined( MIN_RECOG_OPERANDS )
  262.   printf ("\n#define MAX_RECOG_OPERANDS %d\n", 
  263.       ( MIN_RECOG_OPERANDS > max_recog_operands_flag + 4 ) ?
  264.       MIN_RECOG_OPERANDS : max_recog_operands_flag + 4 );
  265. #else
  266.   printf ("\n#define MAX_RECOG_OPERANDS %d\n", max_recog_operands_flag + 4);
  267. #endif
  268. #else
  269.   printf ("\n#define MAX_RECOG_OPERANDS %d\n", max_recog_operands_flag + 4);
  270. #endif
  271.  
  272.   if (max_dup_operands_flag == 0)
  273.     max_dup_operands_flag = 1;
  274. #if defined( DSP56000 ) || defined( DSP96000 )
  275. #if defined( MIN_DUP_OPERANDS )
  276.   printf ("\n#define MAX_DUP_OPERANDS %d\n", 
  277.       ( MIN_DUP_OPERANDS > max_dup_operands_flag ) ?
  278.       MIN_DUP_OPERANDS : max_dup_operands_flag );
  279. #else
  280.   printf ("\n#define MAX_DUP_OPERANDS %d\n", max_dup_operands_flag);
  281. #endif
  282. #else
  283.   printf ("\n#define MAX_DUP_OPERANDS %d\n", max_dup_operands_flag);
  284. #endif
  285.  
  286.   if (register_constraint_flag)
  287.     printf ("#define REGISTER_CONSTRAINTS\n");
  288.  
  289.   fflush (stdout);
  290.   exit (ferror (stdout) != 0 ? FATAL_EXIT_CODE : SUCCESS_EXIT_CODE);
  291. }
  292.